package es.ise.core.mbg.plugins;

import java.util.List;

import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;

/**
 * Este plugin convierte las columnas númericas que sirven de ID al tipo
 * java.lang.Long, en vez de dejarlas como java.math.Decimal. Así son más
 * sencillas de manejar, ya que existe autoboxing.
 * 
 * También convierten aquellas propiedas java que empiecen por "id", para
 * tener correspondencia de tipo.
 * 
 * @author Paco
 *
 */
public class IdsAsLongPlugin extends PluginAdapter
{

	/**
	 * {@inheritDoc}
	 * 
	 * @return siempre devuelve <code>true</code> porque no hay comprobaciones que hacer
	 */
	@Override
	public boolean validate(List<String> arg0)
	{
		return true;
	}

	@Override
	public void initialized(IntrospectedTable table)
	{
		if(table.hasPrimaryKeyColumns()) // si tiene clave primarias (es una tabla)
		{
			for(IntrospectedColumn column: table.getPrimaryKeyColumns())
			{
				//cambio todas las claves primarias que sean numéricas o decimales
				if(isNumeric(column))
				{
					column.setJdbcType(java.sql.Types.INTEGER);
					column.setJdbcTypeName("INTEGER");
					column.setFullyQualifiedJavaType(new FullyQualifiedJavaType("java.lang.Long"));
				}
			}
		}
		
		// recorro ahora todas las columnas buscando las que empiecen por id
		for(IntrospectedColumn column: table.getAllColumns())
		{
			if(column.getJavaProperty().startsWith("id") && isNumeric(column))
			{
				column.setJdbcType(java.sql.Types.INTEGER);
				column.setJdbcTypeName("INTEGER");
				column.setFullyQualifiedJavaType(new FullyQualifiedJavaType("java.lang.Long"));
			}
		}
	}
	
	private boolean isNumeric(IntrospectedColumn column)
	{
		return column.getJdbcType()==java.sql.Types.NUMERIC || column.getJdbcType()==java.sql.Types.DECIMAL;
	}
	
}
